package edu.kit.los.geocoding;

import java.io.IOException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLEncoder;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import edu.kit.los.Utils;

/**
 * @author Felix, Benedikt
 * Liefert die Geodaten für eine Ortsanfrage
 */
public class Geocoding {

	/**
	 * Führt einen Lookup bei der GoogleMaps Geocoding-Api durch und
	 * Liefert zu einer Ortsanfrage (z.B. Straßenname, PLZ, Name der Stadt 
	 * oder Kombination daraus) die entsprechenden Latitude/Longtitude Angaben durch.
	 * @param ortsinfo
	 * @return double[] mit latitude, longtitude und ResponseCode der GoogleGeoCodingApi.
	 * @throws SocketTimeoutException
	 * @throws IOException
	 * @throws JSONException
	 */
	public static double[] geocoding(String ortsinfo)
			throws SocketTimeoutException, IOException, JSONException {

		URL request = null;
		String ort_encoded = URLEncoder.encode(ortsinfo, "UTF-8");
		request = new URL(
				"http://maps.google.com/maps/api/geocode/json?address="
						+ ort_encoded + "&sensor=false");

		String stri = Utils.lookup_event_String(request);
		JSONObject json = new JSONObject(stri);
		JSONArray results = null;
		JSONObject results_object = null;
		JSONObject geom = null;
		JSONObject location = null;

		results = json.getJSONArray("results");

		results_object = results.getJSONObject(0);
		geom = results_object.getJSONObject("geometry");
		location = geom.getJSONObject("location");
		double[] result = new double[3]; //TODO: Response codieren an letzter Stelle des Arrays!
		result[0] = location.getDouble("lat");
		result[1] = location.getDouble("lng");

		return result;
	}
}

